/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Negocio;

import java.util.ArrayList;
import java.util.Enumeration;
import javax.swing.tree.TreeNode;

/**
 *
 * @author Ivan
 */
public class Hoja implements TreeNode, Comparable{
    
    private Hoja padre;
    private ArrayList<Hoja> hijos;
    private Estado estado;
    private boolean esCamino;
    private int nivelHoja;
    private boolean esProcesadoProfundidad=false;

    public boolean isEsProcesadoProfundidad() {
        return esProcesadoProfundidad;
    }

    public void setEsProcesadoProfundidad(boolean esProcesadoProfundidad) {
        this.esProcesadoProfundidad = esProcesadoProfundidad;
    }


    public Hoja(Hoja padre, ArrayList<Hoja> hijos, Estado estado, boolean esCamino, int nivelHoja) {
        this.padre = padre;
        this.hijos = hijos;
        this.estado = estado;
        this.esCamino = esCamino;
        this.nivelHoja = nivelHoja;
    }

    public Hoja() {
        this.padre = null;
        this.hijos = new ArrayList<Hoja>(0);
        this.estado = null;
        this.esCamino = false;
        this.nivelHoja = 0;
    }



    public boolean isEsCamino() {
        return esCamino;
    }

    public void setEsCamino(boolean esCamino) {
        this.esCamino = esCamino;
    }

    public Estado getEstado() {
        return estado;
    }

    public void setEstado(Estado estado) {
        this.estado = estado;
    }

    public ArrayList<Hoja> getHijos() {
        return hijos;
    }

    public void setHijos(ArrayList<Hoja> hijos) {
        this.hijos = hijos;
    }

    public int getNivelHoja() {
        return nivelHoja;
    }

    public void setNivelHoja(int nivelHoja) {
        this.nivelHoja = nivelHoja;
    }

    public Hoja getPadre() {
        return padre;
    }

    public void setPadre(Hoja padre) {
        this.padre = padre;
    }



    public TreeNode getChildAt(int childIndex) {
        return hijos.get(childIndex);
    }

    public int getChildCount() {
        return hijos.size();
       
    }

    public TreeNode getParent() {
        return padre;
    }

    public int getIndex(TreeNode node) {
        return hijos.indexOf(node);
    }

    public boolean getAllowsChildren() {
        return hijos.isEmpty();
    }

    public boolean isLeaf() {
        if(hijos.isEmpty())
            return true;
        return false;
    }

    public Enumeration children() {
        return (Enumeration) hijos;
    }

    public int compareTo(Object o) {
        Hoja hoja=(Hoja)o;

         if(hoja.getEstado().getMetrica()==estado.getMetrica())
            return 0;
        if(hoja.getEstado().getMetrica()>estado.getMetrica())
            return 1;
        return -1;

        //es mayor a 0 va al lado derecha
        //es menor a 1 va primero
    }

    public void agregarHijo(Hoja hoja){
        hijos.add(hoja);
    }

    @Override
    public String toString() {
        return "nivelHoja=" + nivelHoja;
    }

   public boolean esEstadoFinal(){
       return this.estado.isEsFinal();
   }

   public boolean esRaiz(){
       if(padre==null)
           return true;
       return false;
   }

    public Hoja getHijos(int index) {
        return hijos.get(index);
    }

    public int getCantidadHijos() {
        return hijos.size();
    }


    public void obtenerFinal(Estado estadoFinal){
        estado.obtenerEsFinal(estadoFinal);
    }

    @Override
    public boolean equals(Object obj) {
       
        try {
            int[][] otraMatriz = ((Hoja) obj).getEstado().getMatriz();
            int[][] miMatriz = estado.getMatriz();
            //agiliza la comparacion para evitar los ciclos for()
            if(estado.getMetrica()!=((Hoja) obj).getEstado().getMetrica())
                return false;
                
            for (int i = 0; i < miMatriz.length; i++) 
                for (int x = 0; x < miMatriz[i].length; x++) 
                    if (miMatriz[i][x] != otraMatriz[i][x]) 
                        return false;                
            
        } catch (Exception exx) {
            return false;
        }
        return true;
    }
    
    public boolean esIgual(Hoja hoja){
        return equals(hoja);
//        return estado.esIgual(hoja.getEstado());
    }
    
}
